﻿// Inner Fire 游戏引擎库
// DxView DirectX视图管理类
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 管理相机等控制视图的项目。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-04-23

#pragma once

#include <DirectXMath.h>
#include <dx/view/dx_camera.h>
#include <dx/ui/ui_def.h>
#include <DirectXCollision.h>

namespace ifire::dx {
class DxGraphics;

class DxView {
public:
  DxView(DxGraphics* dx);
  DxView(const DxView& rhs) = delete;
  DxView& operator=(const DxView& rhs) = delete;
  ~DxView() = default;

  // 进行初始化
  void InitConfig();

  // 重置相机（每次窗口改变时都需要进行）
  void ResetCamera();
  // 更新视口剪裁
  void UpdateViewport();
  // 控制相机
  void OnCameraInput();
  void UpdateCamera();
  void PerformFrustumCulling();
  // 处理鼠标移动项目
  void OnMouseMove(WPARAM btn_state, float move_x, float move_y);
  void OnMouseWheel(int delta);

  // ------
  // 属性访问
  // ------
  void SetClientSize(UINT width, UINT height);
  float GetAspectRatio() const;
  int GetWidth() const { return client_width_; }
  int GetHeight() const { return client_height_; }  
  UIWidget GetClientWidget() const;
  XMFLOAT2 GetClientSize() const;
  const D3D12_VIEWPORT& GetScreenViewport() const { return screen_viewport_; }
  const D3D12_RECT& GetScissorRect() const { return scissor_rect_; }
  const DirectX::XMFLOAT4X4& GetView() const { return view_; }
  const DirectX::XMFLOAT4X4& GetProjection() const { return projection_; };
  const DirectX::XMFLOAT3& GetEyePos() const { return eye_pos_; }
  const CameraType GetCameraType() const { return camera_type_; }
  void SetCameraType(CameraType type);
  DxCamera& GetCamera() { return camera_; }
  DxSphericalCamera& GetSpherical() { return spherical_camera_; }
  bool IsTakeControl() const { return is_take_control_; }
  void SetTakeControl(bool value) { is_take_control_ = value; }

private:
  DxGraphics* dx_;
  
  // 窗口相关
  int client_width_;               // 窗口宽度
  int client_height_;              // 窗口高度
  float aspect_ratio_;             // 窗口比值，在设置时计算

  // 是否接管控制，如果接管，那么会处理Mouse或键盘消耗
  bool is_take_control_;

  // 用于球状相机
  DxSphericalCamera spherical_camera_; // 球面坐标系相机（简单）
  // 用于常规相机
  DxCamera camera_;
  // 指定相机类型
  CameraType camera_type_ = CameraType::NORMAL;

  // 相机的速度
  float camera_speed_ = 10.0f;

  // 相机原点
  DirectX::XMFLOAT3 eye_pos_ = {0.0f, 0.0f, 0.0f};

  // 用于设置的矩阵
  DirectX::XMFLOAT4X4 view_ = IDENTITY_4X4;
  DirectX::XMFLOAT4X4 projection_ = IDENTITY_4X4;
  
  // 用于视椎体剪裁
  BoundingFrustum camera_frustum_;
  bool frustum_culling_enabled_ = true;
  // 视口
  D3D12_VIEWPORT screen_viewport_;
  // 视口裁剪
  D3D12_RECT scissor_rect_;        
};

} // namespace ifire::dx